Entity ์—ฐ๊ด€ ๊ด€๊ณ„

Note

๊ณ ๊ฐ์ด ์Œ์‹์„ ์ฃผ๋ฌธ ์‹œ, ์ฃผ๋ฌธ ์ •๋ณด๋Š” ์–ด๋А ํ…Œ์ด๋ธ”์— ๋“ค์–ด๊ฐ€์•ผ ํ• ๊นŒ?

  1. ๊ณ ๊ฐ ํ…Œ์ด๋ธ” - ํ•œ ๋ช…์˜ ๊ณ ๊ฐ์€ ์Œ์‹์„ ์—ฌ๋Ÿฌ๊ฐœ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ์Œ โ†’ ์Œ์‹ ์ปฌ๋Ÿผ ์ค‘๋ณต
  2. ์Œ์‹ ํ…Œ์ด๋ธ” - ํ•˜๋‚˜์˜ ์Œ์‹์€ ์—ฌ๋Ÿฌ๋ช…์˜ ๊ณ ๊ฐ์—๊ฒŒ ์ฃผ๋ฌธ๋  ์ˆ˜ ์žˆ์Œ โ†’ ๊ณ ๊ฐ ์ปฌ๋Ÿผ ์ค‘๋ณต

โ†’ ์ฃผ๋ฌธ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์œผ๋กœ ํ•ด๊ฒฐ

๊ณ ๊ฐ : ์Œ์‹ = N : M ๊ด€๊ณ„

  • N:M ๊ด€๊ณ„ ํ…Œ์ด๋ธ”์˜ ์—ฐ๊ด€ ๊ด€๊ณ„ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ฃผ๋ฌธ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ๋‘๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค
  • DB ํ…Œ์ด๋ธ”์—์„œ๋Š” ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ FK๋กœ ๋งบ์„ ์ˆ˜ ์žˆ๊ณ  ๋ฐฉํ–ฅ ์ƒ๊ด€์—†์ด ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋‹ค

๊ทธ๋Ÿฌ๋‚˜ Entity๋Š” ๊ฐ์ฒด ํ˜•ํƒœ์ด๋ฏ€๋กœ ์ƒ๋Œ€ Entity์˜ ํƒ€์ž…์„ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค โ†’ ๋ฐฉํ–ฅ ๊ฐœ๋… ์กด์žฌ

1๋Œ€ 1 ๊ด€๊ณ„ @OneToOne

๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„

์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ ์„ค์ •

  • ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์™ธ๋ž˜ํ‚ค ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅ

  • ์Œ์‹ Entity๊ฐ€ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ธ ๊ฒฝ์šฐ
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @OneToOne
    @JoinColumn(name = "user_id") // ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ด ํ™œ์šฉํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„

  • ์–‘๋ฐฉํ–ฅ์ผ ๊ฒฝ์šฐ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ด ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•จ
  • ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์—์„œ mappedBy ์˜ต์…˜ ์‚ฌ์šฉํ•ด ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ ์ง€์ •
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
 
    @OneToOne(mappedBy = "user")
    private Food food;
}

mappedBy์˜ ์†์„ฑ๊ฐ’์€ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ธ ์ƒ๋Œ€ Entity์˜ ํ•„๋“œ๋ช…์„ ์˜๋ฏธํ•œ๋‹ค

@OneToOne
    @JoinColumn(name = "user_id")
    private User user; -> ์ด ๋ถ€๋ถ„..

Warning

  1. ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ธ Entity์—์„œ @JoinColumn์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ default ์˜ต์…˜์ด ์ ์šฉ๋˜์–ด ์ƒ๋žต ๊ฐ€๋Šฅ

    • ๋‹ค๋งŒ, 1:N ๊ด€๊ณ„์—์„œ ์ƒ๋žตํ•œ๋‹ค๋ฉด ์™ธ๋ž˜ ํ‚ค๋ฅผ ์ €์žฅํ•  ์ปฌ๋Ÿผ์„ ํŒŒ์•…ํ•  ์ˆ˜๊ฐ€ ์—†์–ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์• ๋„ˆํ…Œ์ด์…˜ ์“ฐ๋Š”๊ฒŒ ์ข‹์Œ
  2. ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์—์„œ mappedBy ์˜ต์…˜์„ ์ƒ๋žตํ•  ๊ฒฝ์šฐ์—๋„ ํŒŒ์•… ๋ถˆ๊ฐ€๋Šฅ, ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•˜์ž ~

N ๋Œ€ 1 ๊ด€๊ณ„ @ManyToOne

๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„

  • ์Œ์‹ Entity๊ฐ€ N์˜ ๊ด€๊ณ„๋กœ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„

  • ๊ณ ๊ฐ Entit์—์„œ Java ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Œ์‹ Entity ์ฐธ์กฐ
  • ๊ทธ๋ ‡๋‹ค๊ณ  DB์— user_id 1,2 ์ด๋ ‡๊ฒŒ ์ €์žฅ๋˜๋Š”๊ฑด ์•„๋‹˜
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
 
    @OneToMany(mappedBy = "user") // ์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @JoinColumn์œผ๋กœ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ํ•„๋“œ ์ด๋ฆ„
    private List<Food> foodList = new ArrayList<>();
}

1 ๋Œ€ N ๊ด€๊ณ„ @OneToMany

๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„

  • ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์€ ์Œ์‹์ด์ง€๋งŒ ์‹ค์ œ ์™ธ๋ž˜ํ‚ค๋Š” ๊ณ ๊ฐ entity๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @OneToMany
    @JoinColumn(name = "food_id") // users ํ…Œ์ด๋ธ”์— food_id ์ปฌ๋Ÿผ
    private List<User> userList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}
  • ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์€ ์Œ์‹ entity์ง€๋งŒ ์‹ค์ œ DB์—์„œ ์™ธ๋ž˜ํ‚ค๋Š” ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์ด ๊ฐ–๊ณ  ์žˆ์Œ โ†’ INSERT์‹œ UPDATE๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€

์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„

1๋Œ€ N ๊ด€๊ณ„์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๊ฐ€ ์—†์Œ

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
 
		@ManyToOne
		@JoinColumn(name = "food_id", insertable = false, updatable = false)
		private Food food;
}
  • insertable, updatable์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ์–‘๋ฐฉํ–ฅ์ฒ˜๋Ÿผ ์„ค์ •ํ•  ์ˆ˜๋Š” ์žˆ์Œ

N ๋Œ€ M ๊ด€๊ณ„ @ManyToMany

๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„

  • N : M ๊ด€๊ณ„๋ฅผ ํ’€์–ด๋‚ด๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @ManyToMany
    @JoinTable(name = "orders", // ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    joinColumns = @JoinColumn(name = "food_id"), // ํ˜„์žฌ ์œ„์น˜์ธ Food Entity ์—์„œ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋กœ ์กฐ์ธํ•  ์ปฌ๋Ÿผ ์„ค์ •
    inverseJoinColumns = @JoinColumn(name = "user_id")) // ๋ฐ˜๋Œ€ ์œ„์น˜์ธ User Entity ์—์„œ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋กœ ์กฐ์ธํ•  ์ปฌ๋Ÿผ ์„ค์ •
    private List<User> userList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}
  • JPA์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ด๋ธ”์€ ์ปจํŠธ๋กค์ด ์–ด๋ ค์›Œ ์ถ”ํ›„์— ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ์ด ์žˆ์„๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @ManyToMany
    @JoinTable(name = "orders", // ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    joinColumns = @JoinColumn(name = "food_id"), // ํ˜„์žฌ ์œ„์น˜์ธ Food Entity ์—์„œ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋กœ ์กฐ์ธํ•  ์ปฌ๋Ÿผ ์„ค์ •
    inverseJoinColumns = @JoinColumn(name = "user_id")) // ๋ฐ˜๋Œ€ ์œ„์น˜์ธ User Entity ์—์„œ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋กœ ์กฐ์ธํ•  ์ปฌ๋Ÿผ ์„ค์ •
    private List<User> userList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
 
    @ManyToMany(mappedBy = "userList")
    private List<Food> foodList = new ArrayList<>();
}

์ค‘๊ฐ„ ํ…Œ์ด๋ธ”

  • ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉด ๋ณ€๊ฒฝ ๋ฐœ์ƒ์‹œ ์ปจํŠธ๋กค์ด ์‰ฌ์›Œ์ง
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
 
    @OneToMany(mappedBy = "food")
    private List<Order> orderList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
 
    @OneToMany(mappedBy = "user")
    private List<Order> orderList = new ArrayList<>();
}
@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @ManyToOne
    @JoinColumn(name = "food_id")
    private Food food;
 
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}